package com.demo.controller;

import com.demo.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author chenyuan
 * @date 2020/9/29 10:22
 */
@RestController
public class DeptConsumerController {
    // 消费者没有 Service 层，那就需要使用 Rest 去请求
    // 那么肯定有一个 RestTemplate 模板,这里面肯定有很多供我们调用的方法
    // 既然这样就需要把它注册到 Spring 中

    @Autowired
    private RestTemplate restTemplate;

    /**提供者 URL 的前缀
     *
     * 不使用 Ribbon 时 ，这里就是第一中写法
     *
     * 使用 Ribbon 实现负载均衡 时，这里就不能写死为一个地址，
     *       而需要通过注册中心的服务名来访问
     *       服务名：在 提供者 YML 文件中配置的 spring:application:name: 的值
     *            或者 监控页面的 Application 字段值
     */
    //private static final String REST_URL_PREFIX = "http://localhost:8081";

    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-02-PROVIDER";

    /**
     * 需要去提供者那里获取服务
     * @param id
     * @return
     */
    @RequestMapping("/consumer/getDeptById/{id}")
    public Dept getDeptById(@PathVariable("id")Long id){
        // 去提供者那里，通过 Get 请求获取一个对象
        // getForObject 的参数：提供者地址；【请求所需的参数】 ； 返回值对象的类
        // 请求需要传递的参数；
        //          1. 通过URL拼接；
        //          2. 使用 Map 传参 ；
        //          3. 直接传递参数对象（就像下面的 Add 方法）
        return restTemplate.getForObject(REST_URL_PREFIX+"/queryDeptById/"+id,Dept.class);
    }

    @RequestMapping("/consumer/getDepts")
    public List<Dept> getDepts(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/queryDepts",List.class);
    }

    @RequestMapping("/consumer/addDept")
    public Boolean addDept(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFIX+"/addDept",dept,Boolean.class);
    }
}
